package hashfunctions;

import java.security.NoSuchAlgorithmException;
import java.util.BitSet;

public class HashExtender {

//	static public BitSet hash(HashFunction_128 funcion, int largo, String entrada) throws NoSuchAlgorithmException{
//		StringBuffer salida= new StringBuffer();
//		String acum=entrada;
//		for(int i=largo;i>0;i-=128){
//			//System.out.println("Salida en bytes de la iteracion del hash = " + funcion.hash(acum).length());
//			salida.append(funcion.hash(acum));
//			acum+="a";
//			//System.out.println ("i= " + i+ "; largo string = " + salida.length() + "; algoritmo " + funcion.tipo());
//			
//		}
//		//System.out.println("Largo de la salida extendida = "+ salida.length());
//		return Hash.stringToBitSet(salida.substring(0,largo/8));
//		//System.out.println(Hash.stringToBitSet(salida.toString()).toString());
//		//return Hash.stringToBitSet(salida.toString());
//		
//	}
	
	
	static public BitSet hash(HashFunction_128 funcion, int largo, String entrada) throws NoSuchAlgorithmException{
		StringBuffer salida= new StringBuffer();
		char[] acum=new HashMD5_128().hash(entrada).toCharArray();
		//int pos=(entrada.hashCode()*31+entrada.length()+entrada.charAt(0))%(largo/128);
		int pos=0;
		for(int i=0; i<acum.length;i++){
			pos+=(int)acum[i];
			pos=pos%(largo/128);
		}
		
		for(int i=(largo/128);i>0;i--){
			if(i==pos)
				salida.append(funcion.hash(entrada));
			else
				salida.append("\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0");
				
		}
		
		return Hash.stringToBitSet(salida.substring(0,largo/8));
		
	}
	
}
